#pragma once
#include "rtda/heap/method_descriptor.h"
#include <string>
#include <memory>

namespace jvm {
    namespace heap {

        class MethodDescriptorParser {
        private:
            std::string raw;
            size_t offset = 0;
            std::unique_ptr<MethodDescriptor> parsed;

            void startParams();
            void endParams();
            void finish();
            void causePanic();
            uint8_t readUint8();
            void unreadUint8();
            void parseParamTypes();
            void parseReturnType();
            std::string parseFieldType();
            std::string parseObjectType();
            std::string parseArrayType();

        public:
            std::unique_ptr<MethodDescriptor> parse(const std::string& descriptor);
        };

        std::unique_ptr<MethodDescriptor> parseMethodDescriptor(const std::string& descriptor);

    } // namespace heap
} // namespace jvm
